// function sum () {
//     let res = Array.prototype.slice.call(arguments)
    
//     let adder = function () {
//         res = res.concat(...arguments)
//         return adder
//     }

//     adder.valueOf = function () {
//         return res.reduce((pre, cur) => pre + cur)
//     }

//     return adder
// }



// function sum () {
//     let res = Array.prototype.slice.call(arguments).reduce((a, b) => a + b)

//     let adder = function () {
//         const next = [].slice.call(arguments).reduce((a, b) => a + b)
//         res += next
//         return adder
//     }

//     adder.valueOf = function () {
//         return res
//     }

//     return adder
// }

// console.log(sum(1, 2)(3)(4).valueOf())
// console.log(sum(1, 2, 3, 4).valueOf())
// console.log(sum(1)(2)(3)(4).valueOf())

/**
 * 请在 sum函数中调用此函数，完成数值计算
 * @param {*} a 要相加的第一个值
 * @param {*} b 要相加的第二个值
 * @param {*} callback 相加之后的回调函数
 */
function asyncAdd(a,b,callback) {
    setTimeout(function(){
        callback(null, a+b)
    },100)
}

/**
 * 请在此方法中调用asyncAdd方法，完成数值计算
 * @param  {...any} rest 传入的参数
 */
// async function sum(...rest) {
//     // 取出来第一个作为初始值
//   let result = rest.pop()
//   let next = rest.pop()
  
//   while (next) {
//     result = await new Promise(resolve => {
//         asyncAdd(result, next, (_, res) => {
//             resolve(res)
//         })
//     })
//     next = rest.pop()
//   }
//   return result
// }

// async function sum(...rest) {
//     // 取出来第一个作为初始值
//   let result = 0
  
//   let promises = []
//   promises = rest.map(num => {
//     return new Promise((resolve, reject) => {
//         asyncAdd(result, num, (_, res) => {
//             resolve(res)
//         })
//     })
//   })

//   await Promise.all(promises).then(res => {
//     result = res.reduce((a, b) => a + b)
//   })
// //   console.log(promises)
//   return result
// }

// let start = new Date()
// sum(1, 2, 3, 4, 5, 6).then(res => {
//   // 请保证在调用sum方法之后，返回结果21
//   console.log(res)
//   console.log(`程序执行共耗时: ${new Date() - start}`)
// })



// function myNew(constructor, ...rest) {
//     // 请在此处完善代码，不能直接使用 new 操作符
//     if (typeof constructor !== 'function') {
//         return constructor
//     }

//     const _constructor = Object.create(constructor.prototype)

//     const obj = constructor.apply(_constructor, rest)

//     if (typeof obj === 'object') {
//         return obj
//     } else {
//         return _constructor
//     }
// }

function myNew(...args) {
    // 取出 args 数组第一个参数，即目标构造函数
  const constructor = args.shift()

    // 创建一个空对象，且这个空对象继承构造函数的 prototype 属性
    // 即实现 obj.__proto__ === constructor.prototype
  const obj = Object.create(constructor.prototype)

    // 执行构造函数，得到构造函数返回结果
    // 注意这里我们使用 apply，将构造函数内的 this 指向为 obj
  const result = constructor.apply(obj, args)

    // 如果造函数执行后，返回结果是对象类型，就直接返回，否则返回 obj 对象
  return (typeof result === 'object' && result != null) ? result : obj
}

function Fun(name,sex) {
    this.name = name
    this.sex = sex
}
Fun.prototype.getUserInfo = function() {
    return `我的姓名${this.name},我的性别${this.sex}`
}

const fun = myNew(Fun,'子君','男')
// 我的姓名子君，我的性别男
console.log(fun.getUserInfo())